from django_redis import get_redis_connection
from rest_framework import serializers


class ImageCodeCheckSerializer(serializers.Serializer):
    """图片验证码的序列化器"""
    # 对传进来的两个参数进行校验,首先自己申明
    image_code_id = serializers.UUIDField()
    # text只能是4位
    text = serializers.CharField(max_length=4, min_length=4)

    # 校验完以上两个字段合法后,对上面两个字段进行校验
    def validate(self, attrs):
        image_code_id = attrs['image_code_id']
        text = attrs['text']
        # 查询真实的图形验证码
        # 创建数据库链接
        redis_conn = get_redis_connection('verify_codes')
        real_image_code_text = redis_conn.get('img_%s' % image_code_id)
        if not real_image_code_text:
            raise serializers.ValidationError('图片验证码无效')

        # 查询到真实的图片验证码之后删除
        # 保证每张图片验证码只校验一次
        redis_conn.delete('img_%s' % image_code_id)


        # 比较图像验证码
        # 从数据库中取出来的数据是字节码,需要先解码
        real_image_code_text = real_image_code_text.decode()
        if real_image_code_text.lower() != text.lower():
            raise serializers.ValidationError('图片验证码错误')

        # 判断是否在60s内
        # get_serializer方法在创建的时候会补充context属性
        # context属性包含request, format, view 三个参数
        # self.context['view'],可以获取到类视图对象,可以提取参数
        # django的类视图对象中,kwargs属性保存了路径提取出来的参数

        mobile = self.context['view'].kwargs['mobile']
        # 查询发送记录,短信验证码视图中设置保存
        send_flag = redis_conn.get('send_flag_%s' % mobile)
        if send_flag:
            raise serializers.ValidationError('请求次数过去频繁')
        return attrs